package org.go.trigger;

import java.io.Serializable;

/**
 * An interface to be implemented by objects that define spaces of time during 
 * which an associated <code>{@link Trigger}</code> may (not) fire. Calendars 
 * do not define actual fire times, but rather are used to limit a 
 * <code>Trigger</code> from firing on its normal schedule if necessary. Most 
 * Calendars include all times by default and allow the user to specify times 
 * to exclude. 
 * 
 * <p>As such, it is often useful to think of Calendars as being used to <I>exclude</I> a block
 * of time - as opposed to <I>include</I> a block of time. (i.e. the 
 * schedule &quot;fire every five minutes except on Sundays&quot; could be 
 * implemented with a <code>SimpleTrigger</code> and a 
 * <code>WeeklyCalendar</code> which excludes Sundays)</p>
 * 
 * <p>Implementations MUST take care of being properly <code>Cloneable</code> 
 * and <code>Serializable</code>.</p>
 * 
 * @author hejie
 */
public interface Calendar extends Serializable, Cloneable {

	int MONTH = 0;

	Object clone();

	/**
	 * <p>
	 * Get the base calendar. Will be null, if not set.
	 * </p>
	 */
	Calendar getBaseCalendar();

	/**
	 * <p>
	 * Return the description given to the <code>Calendar</code> instance by
	 * its creator (if any).
	 * </p>
	 * 
	 * @return null if no description was set.
	 */
	String getDescription();

	/**
	 * <p>
	 * Determine the next time (in milliseconds) that is 'included' by the
	 * Calendar after the given time.
	 * </p>
	 */
	long getNextIncludedTime(long timeStamp);

	/**
	 * <p>
	 * Determine whether the given time (in milliseconds) is 'included' by the
	 * Calendar.
	 * </p>
	 */
	boolean isTimeIncluded(long timeStamp);

	/**
	 * <p>
	 * Set a new base calendar or remove the existing one.
	 * </p>
	 */
	void setBaseCalendar(Calendar baseCalendar);

	/**
	 * <p>
	 * Set a description for the <code>Calendar</code> instance - may be
	 * useful for remembering/displaying the purpose of the calendar, though
	 * the description has no meaning to Quartz.
	 * </p>
	 */
	void setDescription(String description);
}
